import Vue from 'vue'
import _ from 'lodash'
import VueRouter from 'vue-router'
import { commonRouter, diffRouter } from './data'
import store from '@/store'
import {
  Message
} from 'element-ui'

Vue.use(VueRouter)

const routes = [
  ...commonRouter
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

/**
 * 是否有权限访问某个路径
 * @param {String} toPath 该路径
 */
const hasPermission = toPath => {
  const menuUris = _.map(store.state.menus, 'menuUri')
  return _.indexOf(menuUris, toPath) >= 0
}

// 根据菜单生成路由的菜单元数据
const generateMenuName = route => {
  const menu = _.find(store.state.menus, { menuUri: route.path })
  if (!menu) {
    return
  }
  const menuName = menu.menuName
  if (route.meta) {
    route.meta.menuName = menuName
  } else {
    route.meta = { menuName }
  }
  _.forEach(route.children, child => {
    generateMenuName(child)
  })
}

// 动态生成路由表
const generateRoutes = () =>
  _.filter(diffRouter, route => {
    const flag = hasPermission(route.path)
    if (flag) {
      generateMenuName(route)
    }
    return flag
  })

// 导航之前拦截器
router.beforeEach((to, from, next) => {
  console.log('xxxxx', to)
  if (to.meta.anonymous) {
    next()
    return
  }

  // 没有Token，尝试从本地存储中重新加载Token
  if (store.state.token === null) {
    const token = sessionStorage.getItem('token')
    if (token != null && token.toUpperCase() !== 'NULL') {
      store.commit('setToken', token)
    }
  }
  // 有Token
  if (store.state.token !== null) {
    // 没有菜单信息，重新从服务器加载菜单
    if (store.state.menus.length === 0) {
      store.dispatch('reloadUserAuthority')
        .then(() => {
          const routes = generateRoutes()
          router.addRoutes(routes)
          next({ ...to, replace: true })
        })
        .catch(() => {
          next('/')
        })
    } else if (hasPermission(to.path)) {
      // 有权限
      next()
    } else {
      Message({
        message: '该用户无权限访问',
        type: 'error'
      })
      // 无权限访问，返回到登陆页面
      next('/')
    }
  } else {
    Message({
      message: '会话已经过期，请重新登录',
      type: 'error'
    })
    // 本地没有Token，需要重新登陆
    next('/')
  }
})
export default router
